import numpy as np
import cv2
from opencv.img_utils import get_rgb_img, show_two_imgs

file_name_ring_girl = 'img/girl.png'
file_name_hat_girl = 'img/lena.bmp'


def opencv_api():
    src = get_rgb_img(file_name_ring_girl)
    # 均值滤波
    # dst = cv2.boxFilter(get_rgb_img(file_name),3, (4, 4))
    # show_two_imgs(src, 'src', dst, 'dst')

    # 高斯滤波  也为高斯模糊，它是对区域内的像素的加权平均，高斯分布的标准差越小
    # k_size:(5,5) 必须为正奇数 sigmaX为x方向的内核标准差 sigmaX为y方向
    # 标准差较小，表示生成模板的中心数值较大，周围洗漱较小。
    # 标准差较大，生成模板系数相差就不是很大，类似于均值滤波
    # dst = cv2.GaussianBlur(get_rgb_img(file_name), (5, 5),0)
    # show_two_imgs(src, 'src', dst, 'dst')

    # 中值滤波：选择矩阵内的中值填充当前像素  通常用于处理随机椒盐滤波效果较好
    # 对椒盐噪声有很好的去燥效果
    # dst = cv2.medianBlur(get_rgb_img(file_name), 5)
    # show_two_imgs(src, 'src', dst, 'dst')

    # 高斯双边滤波: 为高斯滤波的特殊化，它认为邻域的两边的差值较大，所以在加权平均的时候可先得出属于那边的，在进行加权平均
    # 对图像里面的高频噪声不能够去除干净，对低频噪声有很好的去除效果
    # d参数表示在过滤期间使用的每个像素邻域的直径。如果输入d非0，则sigmaSpace由d计算得出，如果sigmaColor没输入，则sigmaColor由sigmaSpace计算得出。
    # sigmaColor参数表示色彩空间的标准方差，一般尽可能大。较大的参数值意味着像素邻域内较远的颜色会混合在一起，从而产生更大面积的半相等颜色。
    # sigmaSpace参数表示坐标空间的标准方差(像素单位)，一般尽可能小。参数值越大意味着只要它们的颜色足够接近，越远的像素都会相互影响。当d > 0
    # 时，它指定邻域大小而不考虑sigmaSpace。 否则，d与sigmaSpace成正比。
    # dst = cv2.bilateralFilter(get_rgb_img(file_name), 0,100,15)
    # show_two_imgs(src, 'src', dst, 'dst')

    # 均值漂移滤波：既寻找给定领域内的质心
    dst = cv2.bilateralFilter(get_rgb_img(file_name_ring_girl), 0, 100, 15)
    show_two_imgs(src, 'src', dst, 'dst')


def gaussian_kernel(src, k_size, sigma):
    '通过设置高斯分布的𝜎值，便能够获取相应的分布的卷积核，然后进行卷积运算（内积）便能够实现高斯平滑滤波'
    k1 = cv2.getGaussianKernel(k_size, sigma)
    kernel = k1 * k1.T   #(k1.T代表k1的转置)
    dst = cv2.filter2D(src, src.shape[2], kernel)
    return dst


def gaussian_sharpening_kernel(src):
    '锐化(高通滤波)：希望突出图像中的边缘和角点，需要抑制低频成分，达到锐化目的，通过设置不同的卷积核便能实现'
    kernel = np.array([-1, -2, -1, -2, 19, -2, -1, -2, -1]) / 7.0
    dst = cv2.filter2D(src, src.shape[2], kernel)
    return dst


def test():
    # opencv_api()

    # src = get_rgb_img(file_name_ring_girl)
    # dst = gaussian_kernel(src, 3, 2)
    # show_two_imgs(src, 'src', dst, 'dst')

    src = get_rgb_img(file_name_hat_girl)
    dst = gaussian_sharpening_kernel(src)
    show_two_imgs(src, 'src', dst, 'dst')


test()
